package pool

import (
	"sync/atomic"
)

type F func()

// Worker是执行任务的实际执行者，
// 它启动一个接受任务的goroutine并执行函数调用。
type Worker struct {
	Pool *Pool //标记所属pool

	Task chan F // 当前worker需执行的任务（方法）

}

func (w *Worker) Run() {

	go func() {

		//监听当前work的任务队列，一旦有任务立马执行
		for f := range w.Task {

			if f == nil {

				//atomic是最轻量级的锁
				//CAS(原子)操作的优势是，可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作。
				//这可以大大的减少同步对程序性能的损耗。
				//当然，CAS操作也有劣势。在被操作值被频繁变更的情况下，CAS操作并不那么容易成功。
				//通过原子操作保证当前过程不被中断,同时CPU只进行该针对该值得操作，原子操作仅会由一个独立的CPU指令代表和完成
				//用原子操作来替换mutex锁 其主要原因是，原子操作由底层硬件支持，而锁则由操作系统提供的API实现。若实现相同的功能，前者通常会更有效率。
				//https://studygolang.com/articles/3557

				atomic.AddInt32(&w.Pool.Running, -1) //对所属pool正在进行的worker/goroutine减1 表示当前woker空闲
				return
			}

			f() // 执行方法

			w.Pool.PutWorker(w)

		}

	}()

}

func (w *Worker) Stop() {
	w.Task <- nil

}
